namespace System;

public static class ArrayExtensions
{
    /// <summary>
    /// <see cref="Array.Exists{T}(T[], Predicate{T})"/> 的流式替代方案。
    /// </summary>
    /// <remarks>
    /// <para>
    /// 根据 <see href="https://rules.sonarsource.com/csharp/RSPEC-6605">SonarSource 规则 RSPEC-6605</see>，
    /// 最好使用此方法而不是通用的 `Any()` 扩展方法。
    /// </para>
    /// </remarks>
    public static bool Exists<T>(this T[] array, Predicate<T> match) => Array.Exists(array, match);

    /// <summary>
    /// <see cref="Array.Find{T}(T[], Predicate{T})"/> 的流式替代方案。
    /// </summary>
    /// <remarks>
    /// <para>
    /// 根据 <see href="https://rules.sonarsource.com/csharp/RSPEC-6602">SonarSource 规则 RSPEC-6602</see>，
    /// 最好使用此方法而不是通用的 `FirstOrDefault()` 扩展方法。
    /// </para>
    /// </remarks>
    public static T Find<T>(this T[] array, Predicate<T> match) => Array.Find(array, match);

    /// <summary>
    /// <see cref="Array.FindAll{T}(T[], Predicate{T})"/> 的流式替代方案。
    /// </summary>
    public static T[] FindAll<T>(this T[] array, Predicate<T> match) => Array.FindAll(array, match);

    /// <summary>
    /// <see cref="Array.FindIndex{T}(T[], Predicate{T})"/> 的流式替代方案。
    /// </summary>
    /// <remarks>
    /// <para>
    /// 根据 <see href="https://rules.sonarsource.com/csharp/RSPEC-6603">SonarSource 规则 RSPEC-6603</see>，
    /// 最好使用此方法而不是通用的 `All()` 扩展方法。
    /// </para>
    /// </remarks>
    public static bool TrueForAll<T>(this T[] array, Predicate<T> match) => Array.TrueForAll(array, match);
}
